CORRESPONDING
Jeder kennt den Befehl MOVE-CORRESPONDING um alle Felder der einen Struktur in die entsprechenden Felder einer anderen Struktur zu kopieren oder SELECT … INTO CORRESPONDING FIELDS um einen Datenbank-Select in die gleichnamigen Felder der internen Tabelle oder Struktur einzulesen.
Mit Netweaver Release 7.40 ist ein neuer CORRESPONDING dazu gekommen. Ausnahmsweise eine Spracherweiterung, die wirklich eindeutig und auf Anhieb zu verstehen ist:
itab_ziel = CORRESPONDING #( itab_quelle MAPPING ziel_feld = quell_feld ).
Eine wirklich schöne und elegante Erweiterung des ABAP Sprachschatzes.
Genauere und weitere Informationen findet ihr hier: ABAP News for Release 7.40 SP05
Codebeispiel
TYPES: BEGIN OF ty_mat, matnr TYPE matnr, werks TYPE werks_d, lgort TYPE lgort_d, menge TYPE p DECIMALS 2, END OF ty_mat. DATA gt_mat TYPE STANDARD TABLE OF ty_mat. DATA gt_mard TYPE STANDARD TABLE OF mard. START-OF-SELECTION. SELECT * FROM mard INTO TABLE gt_mard UP TO 20 ROWS. gt_mat = CORRESPONDING #( gt_mard MAPPING menge = labst ).
CORRESPONDING mit separater Wertzuweisung
Bei der Verwendung von CORRESPONDING kann man Werte gleicher Feldnamen zuweisen. Mit dem Zusatz MAPPING können Ausnahmen definiert werden.
TYPES: BEGIN OF ts_1, matnr TYPE matnr, mng TYPE i, flag TYPE abap_bool, END OF ts_1, BEGIN OF ts_2, matnr TYPE matnr, menge TYPE i, END OF ts_2. DATA dst TYPE ts_1. DATA src TYPE ts_2. src-matnr = 'ABCD'. src-menge = 100. dst = CORRESPONDING #( src MAPPING mng = menge ).
Was macht man jedoch, wenn man der Zielstruktur noch einen Wert zuweisen möchte, der nicht in der Quellstruktur vorkommt?
Hierfür kann man den Zusatz BASE nutzen:
dst = VALUE #( BASE CORRESPONDING #( src MAPPING mng = menge ) flag = 'X' ).
Dies kann natürlich auch mit cond verbunden werden:
dst = VALUE #( BASE CORRESPONDING #(
src MAPPING mng = menge )
flag = COND #(
WHEN src-menge > 0 THEN 'H'
WHEN src-menge < 0 THEN 'S'
ELSE 'X' ) ).
- Meine Eclipse-Plugins - 22. November 2024
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
Msn darf #CORRESPONDING nur auf gar keinen Fall mit MOVE-CORRESPONDING verwechseln. Habe ich kürzlich noch bei jemandem erlebt, der meinte, die beiden Anweisungen machten das gleiche. Dem ist nicht so.
Die Benutzung des Befehls CORRESPONDING ist sehr ausführlich unter http://help.sap.com/abapdocu_740/de/index.htm?file=abapmove-corresponding.htm erklärt.
Hier wird auch das Pendant zu MOVE-CORROSPONDING erläutert, bei dem das Wort BASE entscheidend ist:
Eine Zuweisung von Strukturen
struct2 = CORRESPONDING #( BASE ( struct2 ) struct1 ).
ist das Gleiche wie eine Zuweisung
MOVE-CORRESPONDING struct1 TO struct2.
Eine Zuweisung von internen Tabellen
itab2 = CORRESPONDING #( BASE ( itab2 ) itab1 ).
ist das Gleiche wie eine Zuweisung
MOVE-CORRESPONDING itab1 TO itab2 KEEPING TARGET LINES.